【小ネタ】Route53のレコードをCLIから変更する際のDELETE/CREATEの動き
はじめに
こんにちは!AWS事業本部の島川です。
まず、Route53のレコードの更新をCLIから行う場合、aws route53 change-resource-record-sets
コマンドのUPSERTアクションとDELETE/CREATEアクションを組み合わせた方法2種類あります。
基本的にUPSERTでやりたいところですが、更新できないパターンがいくつかあります。
- Aレコード → CNAMEレコードのようなレコードのタイプを変更するもの
- Aレコード → Aレコードでもルーティングポリシーを変更などの変更
そういった場合にDELETE/CREATEを使います。ただ、DELETEはOKだったけどCREATEで失敗したらどうなってしまうのか?という疑問があったので実際に確認しました。 結論からいうと削除してから作成するといった動きに見えますが、実際にはUPSERTと同じ動きをします。消えてしまうなどといったことは起きませんでした。
補足:aws route53 change-resource-record-sets
コマンドのアクションについて
- CREATE レコード作成
- DELETE レコード削除
- UPSERT レコード更新
aws route53 change-resource-record-sets
コマンドの使い方については下記ドキュメントが参考になります。
AWS CLI を使用して Amazon Route 53 でシンプルなリソースレコードセットを作成する方法を教えてください。
それでは確認していきます!
環境
事前にRoute53に「uho.local」というドメインのプライベートホストゾーンを登録しました。
その中の「test.uho.local」レコードが今回の変更対象になります。
やってみる
UPSERTで更新をしてみる
AレコードからAレコード等のシンプルな変更についてはUPSERTでOKです。
UPSERT成功パターン
Aレコード→Aレコードの変更です。
- sample.jsonの中身
{ "Comment": "CREATE/DELETE/UPSERT test", "Changes": [ { "Action": "UPSERT", "ResourceRecordSet": { "Name": "test.uho.local", "Type": "A", "TTL": 300, "ResourceRecords": [ { "Value": "10.0.0.2" } ] } } ] }
- コマンド
$ aws route53 list-resource-record-sets --hosted-zone-id ************** ###省略### "Name": "test.uho.local.", "Type": "A", "TTL": 300, "ResourceRecords": [ { "Value": "10.0.0.1" } ] ###省略### $ aws route53 change-resource-record-sets --hosted-zone-id ************** --change-batch file://sample.json { "ChangeInfo": { "Id": "/change/**************", "Status": "PENDING", "SubmittedAt": "2019-11-15T09:28:44.906Z", "Comment": "CREATE/DELETE/UPSERT test" } }
- 確認
$ aws route53 get-change --id /change/************** { "ChangeInfo": { "Id": "/change/**************", "Status": "INSYNC", "SubmittedAt": "2019-11-15T09:28:44.906Z", "Comment": "CREATE/DELETE/UPSERT test" } } $ aws route53 list-resource-record-sets --hosted-zone-id ************** ###省略### "Name": "test.uho.local.", "Type": "A", "TTL": 300, "ResourceRecords": [ { "Value": "10.0.0.2" } ] ###省略###
問題なく実施できました。
UPSERT失敗パターン
Aレコード→CNAMEレコードの変更です。
- sample_cname.jsonの中身
{ "Comment": "CREATE/DELETE/UPSERT test", "Changes": [ { "Action": "UPSERT", "ResourceRecordSet": { "Name": "test.uho.local", "Type": "CNAME", "TTL": 300, "ResourceRecords": [ { "Value": "test_1.uho.local" } ] } } ] }
- コマンド
$ aws route53 change-resource-record-sets --hosted-zone-id ************** --change-batch file://sample_cname.json An error occurred (InvalidChangeBatch) when calling the ChangeResourceRecordSets operation: [RRSet of type CNAME with DNS name test.uho.local. is not permitted as it conflicts with other records with the same DNS name in zone uho.local.]
失敗しました。
DELETE/CREATEで更新をしてみる
UPSERTで失敗したJSONをDELETE/CREATE用に書き直します。
変更前(DELETE)と変更後(CREATE)の情報を記載します。
- sample2.jsonの中身
{ "Comment": "CREATE/DELETE/UPSERT test", "Changes": [ { "Action": "DELETE", "ResourceRecordSet": { "Name": "test.uho.local", "Type": "A", "TTL": 300, "ResourceRecords": [ { "Value": "10.0.0.2" } ] } }, { "Action": "CREATE", "ResourceRecordSet": { "Name": "test.uho.local", "Type": "CNAME", "TTL": 300, "ResourceRecords": [ { "Value": "test_1.uho.local" } ] } } ] }
- コマンド
$ aws route53 change-resource-record-sets --hosted-zone-id *************** --change-batch file://sample2.json { "ChangeInfo": { "Id": "/change/**************", "Status": "PENDING", "SubmittedAt": "2019-11-15T09:28:44.906Z", "Comment": "CREATE/DELETE/UPSERT test" } }
- 確認
$ aws route53 list-resource-record-sets --hosted-zone-id ************** ###省略### "Name": "test.uho.local.", "Type": "CNAME", "TTL": 300, "ResourceRecords": [ { "Value": "test_1.uho.local" } ] ###省略###
できました。
DELETEの後のCREATEで失敗したらどうなる?
本題です。Aレコード→CNAMEレコードの変更で、Type AのままでCNAMEに変え忘れた!という想定でやってみます。
- sample3.json
{ "Comment": "CREATE/DELETE/UPSERT test", "Changes": [ { "Action": "DELETE", "ResourceRecordSet": { "Name": "test.uho.local", "Type": "A", "TTL": 300, "ResourceRecords": [ { "Value": "10.0.0.2" } ] } }, { "Action": "CREATE", "ResourceRecordSet": { "Name": "test.uho.local", "Type": "A", "TTL": 300, "ResourceRecords": [ { "Value": "test_1.uho.local" } ] } } ] }
- コマンド
$ aws route53 change-resource-record-sets --hosted-zone-id ************** --change-batch file://sample3.json An error occurred (InvalidChangeBatch) when calling the ChangeResourceRecordSets operation: [Invalid Resource Record: FATAL problem: ARRDATAIllegalIPv4Address (Value is not a valid IPv4 address) encountered with 'test_1.uho.local']
- 確認
$ aws route53 list-resource-record-sets --hosted-zone-id ************** ###省略### "Name": "test.uho.local.", "Type": "A", "TTL": 300, "ResourceRecords": [ { "Value": "10.0.0.2" } ] ###省略###
失敗しても変更はされておらずそのままでした。
さいごに
UPSERT失敗したらDELETE/CREATEでやりましょう!